


//
//  EmotionManager.swift
//  Sina
//
//  Created by YYY on 2017/8/29.
//  Copyright © 2017年 成品家（北京）网路科技有限公司. All rights reserved.
//

import Foundation
import UIKit
/*
 1:黄色文件夹：打包的时候，不会创建目录，主要保存程序文件，素材文件不允许重名
 2:蓝色文件夹：打包的时候，会创建目录，可以分目录存储素材文件，素材文件允许重名
 3:切忌：不要把程序文件放在蓝色文件夹中
 
 Bundle：
 1:通常用在第三方框架的素材
 2:可以按照黄色文件夹的方式拖拽，同时会保留目录结构。
 3:可以避免文件重名。
 
 */



//表情包管理器
class EmotionManager
{
    //便于表情复用，通过单例，加载一次表情数据
    //表情管理器单例
    static let shared = EmotionManager()
    
    //表情包的懒加载数组
    //第一个数组是最近表情，加载之后，表情数组是空
    lazy var emotionsGroupArray = [CPJEmoticonGroupModel]()
    
    //var recte = <#value#>
    
    //表情素材的bundle
    lazy var bundle: Bundle = {
        
        let path = Bundle.main.path(forResource: "HMEmoticon.bundle", ofType: nil)
        let tempBundle = Bundle(path: path!)
        return tempBundle!
    }()
    
    //在init构造函数前面加一个“private”修饰符，可以要求调用者必须通过shared访问对象
    private init() {
        
        //表情包数据加载
        loadPackage()
    }
    
    /// 添加最近使用的表情
    ///
    /// - Parameter emotionModel: 选中的表情
    func recentEmoticons(emotionModel: CPJEmoticonModel)
    {
        //增加表情的使用次数
        emotionModel.times += 1
        
        //判断是否已经记录了该表情，如果没有该表情记录，添加该表情记录
        if !emotionsGroupArray[0].emoticonsModelArray.contains(emotionModel)
        {
            emotionsGroupArray[0].emoticonsModelArray.append(emotionModel)
        }
        //使用频率高的表情靠前，对使用的表情进行排序
//        emotionsGroupArray[0].emoticonsModelArray.sort { (em1, em2) -> Bool in
//            
//            return em1.times > em2.times
//        }
        emotionsGroupArray[0].emoticonsModelArray.sort {
            $0.times > $1.times
        }
        //判断表情数组是否超出20，如果超出，删除末尾表情
        if emotionsGroupArray[0].emoticonsModelArray.count > 20
        {
            emotionsGroupArray[0].emoticonsModelArray.removeSubrange(20..<emotionsGroupArray[0].emoticonsModelArray.count)
            
            
        }
    }
    
    
}

//表情字符串的处理
extension EmotionManager
{
    
    /// 将给定的字符串转换为属性文本
    ///
    /// - Parameters: 关键点：按照匹配结果倒序替换属性文本
    ///   - string: 完整字符串
    ///   - font: 文本字体
    /// - Returns: 属性文本
    func emoticonString(string: String, font: UIFont) -> NSMutableAttributedString
    {
        let attributedString = NSMutableAttributedString(string: string)
        
        // "我[笑哈哈]哎[马上有对象]"
        //建立正则表达式，过滤所有的表情和文字
        //[] ()都是正则表达式的关键字，如果参与匹配，需要转义
        let pattern = "\\[.*?\\]"
        
        guard let regx = try? NSRegularExpression(pattern: pattern, options: []) else
        {
            return attributedString
        }
        
        //匹配所有项
        let matches = regx.matches(in: string, options: [], range: NSRange(location: 0, length: attributedString.length))
        
        //按照匹配结果倒序替换属性文本
        for match in matches.reversed()
        {
            let range = match.rangeAt(0)
            
            let subString = (attributedString.string as NSString).substring(with: range)
            
            if let model = EmotionManager.shared.emoticonManager(string: subString)
            {
                attributedString.replaceCharacters(in: range, with: model.imageText(font: font))
            }
        }
        
        //统一设置字符串字体
        attributedString.addAttributes([NSFontAttributeName: font], range: NSRange(location: 0, length: attributedString.length))
        attributedString.addAttributes([NSForegroundColorAttributeName: UIColor.darkGray], range: NSRange(location: 0, length: attributedString.length))
        return attributedString
    }
    
    func emoticonManager(string: String) -> CPJEmoticonModel?
    {
        for groupModel in emotionsGroupArray
        {
            //三种尾随闭包的简写格式
            
            //方法1 
            //在表情数组中过滤string
//            let result = groupModel.emoticonsModelArray.filter({ (emoticonModel) -> Bool in
//                return emoticonModel.chs == string
//            })
            
            //方法2 尾随闭包
//            let result = groupModel.emoticonsModelArray.filter(){ (emoticonModel) -> Bool in
//                return emoticonModel.chs == string
//            }
            
            //方法3 如果闭包中只有一句，并且是返回
            //闭包格式定义可以省略
            //参数省略之后，使用$0 $1 $2，依次替代原有参数
//            let result = groupModel.emoticonsModelArray.filter(){
//                return $0.chs == string
//            }
            
            //方法4 如果闭包中只有一句，并且是返回
            //闭包格式定义可以省略
            //参数省略之后，使用$0 $1 $2，依次替代原有参数
            //return也可以省略
            let result = groupModel.emoticonsModelArray.filter(){
                $0.chs == string
            }
            
            if result.count == 1
            {
                return result[0]
            }
        }
        
        return nil
    }
}
private extension EmotionManager
{
    // MARK：表情包数据处理
    func loadPackage()
    {
        //读取路径
        guard let path = Bundle.main.path(forResource: "HMEmoticon.bundle", ofType: nil),
            let bundle = Bundle(path: path),
            let plistPath = bundle.path(forResource: "emoticons.plist", ofType: nil),
            let plistArray = NSArray(contentsOfFile: plistPath) as? [[String: String]],
            let modelArray = NSArray.yy_modelArray(with: CPJEmoticonGroupModel.self, json: plistArray) as? [CPJEmoticonGroupModel]
            else
        {
            return
        }

        emotionsGroupArray += modelArray
        
    }
}
